package com.abel.bigwater.data.jnrq

import io.netty.buffer.ByteBuf
import kotlin.experimental.and

/**
 * 2、应答下载地址表，上行报文（集中器→服务器）
 * 说明：
 总包数、 包序号、 本包表数与下载地址表下行报文对应一致。
 状态字： 01 表示下载成功， 00 表示下载失败。
 备用 2 位置第 6 字节 SVH 表示集中器软件版本，其他字节默认 00H。
 */
class JnrqDownloadAddrReply : JnrqData() {
    val bak1 = 0

    var totalPackageCount: Int? = null

    var packageIndex: Int? = null

    var meterCountInPackage: Int? = null

    var downloadState: Short? = null

    var bak21 = byteArrayOf(0, 0, 0, 0, 0)

//    var swVersion: Short? = null

    var bak23 = 0

    init {
        dataLen = 1 + 1 + 1 + 1 + 1 + 7
    }

    /**
     * 计算数据长度，针对解析和打包
     */
    override fun computeDataLen(): Int {
        return dataLen!!
    }

    /**
     * 从当前位置写入打包字节流
     */
    override fun fillBuffer(buf: ByteBuf) {
        buf.alloc().buffer().apply {
            writeByte(bak1)

            writeByte(totalPackageCount!!)

            writeByte(packageIndex!!)

            writeByte(meterCountInPackage!!)

            writeByte(downloadState!!.toInt())

            // 备用 2 位置第 6 字节 SVH 表示集中器软件版本，其他字节默认 00H。
            writeBytes(bak21)

            writeByte(swVersion!!.toInt())

            writeByte(bak23)

            // 写入buf
            buf.writeBytes(this)
        }
    }

    /**
     * 解析字节流，从buf当前位置开始，并且消费其中的字节。
     */
    override fun parseBuffer(buf: ByteBuf) {
        buf.duplicate().apply {
            readByte()

            totalPackageCount = readByte().toInt().and(0xFF)

            packageIndex = readByte().toInt().and(0xFF)

            meterCountInPackage = readByte().toInt().and(0xFF)

            downloadState = readByte().toShort().and(0xFF)

            // 备用 2 位置第 6 字节 SVH 表示集中器软件版本，其他字节默认 00H。
            readBytes(bak21)

            swVersion = readByte().toShort().and(0xFF)

            readByte()
        }

        buf.skipBytes(dataLen!!)
    }

}
